Introducción

El desarrollo de enfermedades laborales pueden ocasionar bajas laborales. Estás enfermedades se producen en el ámbito laboral según el trabajo realizado, pero queremos estudiar como el desarrollo de estas enfermedades se puede agravar por poseer una enfermedad mental, incluso si la gravedad de la enfermedad laboral es distinta entre géneros o debido a la profesión realizada.

Objetivo general

Evaluación del desarrollo de enfermedades laborales, respecto a la profesión y el estado de salud mental.

Objetivo específico

  • ¿Existe relación la profesión de movimiento de tierra respecto al desarrollo de enfermedades psicológicas?
  • ¿Existe relación entre el desarrollo de enfermedades laborales respecto al sexo?
  • ¿Exsite relación entre la gravedad de una enfermedad psicológica respecto al desarrollo de una enfermedad laboral?

Metodología

Materiales

Agregamos los URL del lugar de obtención de los datos: - Enfermedades laborales - Estado de salud mental - Tipos de trabajos - Grado de lesión de la enfermedad laboral

Agregamos el URL del repositorio: - Repositorio

Carga de datos

Descargar datos

Podemos descargar los datos de Canarias en formato .csv de la página web de datos del gobierno de España, desde R mediante este código:

#install.packages("readxl")
library(readxl)

# URL del archivo Excel en GitHub
url <- "https://github.com/Lucia-G-R/Seminario_Fuentes/blob/main/INPUT/DATA/Enfermedades_laborales_Espa%C3%B1a.csv.csv"

# Creamos un archivo temporal para almacenar el Excel
temp <- tempfile(fileext = ".csv")

# Descargamos el archivo desde GitHub
download.file("https://datos.gob.es/es/catalogo/a05003423-poblacion-de-16-y-mas-anos-segun-autovaloracion-del-estado-de-salud-en-relacion-a-situaciones-de-ansiedad-o-depresion-sexos-o-grupos-de-edad-por-anos-canarias-2004-2009", destfile = temp, mode = "wb")

Carga de paquetes

Paquetes necesarios para JSON

# Paquetes necesarios para JSON 
#install.packages("tidyjson")

Paquetes necesarios para xls

# Paquetes necesarios para xls
#install.packages("readxl")

Paquetes necesarios para csv

# Paquetes necesarios para csv
#install.packages("readr")

Paquetes necesarios para xlsx

# Paquetes necesarios para xlsx
#install.packages("readxl")

Paquete necesario para la manipulación de dataframes

# Paquete necesario para la manipulación de dataframes
#install.packages("dplyr") 

Paquete necesario para transformar las filas y columnas

# Paquete necesario para transformar las filas y columnas
#install.packages("tidyverse")

Paquete para mostrar las tablas formatedas

#Paquete para mostrar tablas formatedas
#install.packages("DT")

Carga de datos JSON

Queremos extraer los datos sobre las enfermedades laborales que suceden en España. Como es un archivo con extensión .JSON con listas anidadas sin etiquetar, no podemos utilizar directamente un tibbe para ello, utilizaremos tidyjson.

library(rjson)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(tidyjson)
## 
## Adjuntando el paquete: 'tidyjson'
## 
## The following object is masked from 'package:stats':
## 
##     filter
library(dplyr)
library(DT)

# Cargamos el archivo JSON, pero está en formato de lista.
espana_json <- fromJSON(file = "INPUT/DATA/Enfermedades_laborales_España.json")

# Observamos la estructura, nos damos cuenta que posee listas anidadas
#str(espana_json)

# Convertimos la lista de la varable MetaData en un dataframe
MetaData_df<-
  espana_json%>%
  enter_object("MetaData")%>% # Extreamos la infromación dentro de "MetaData"
  gather_array() %>% # Convierte los elementos de un array en filas
  spread_all()%>% # Esta función distribuye cualquier objeto JSON que sea escalar en nuevas columnas
  select(T3_Variable, Nombre, Codigo) # Seleccionamos las tres variables que posee 

# Convertimos la lista de la variable Data en un dataframe
Data_df<-
  espana_json%>%
  enter_object("Data")%>% # Extreamos la infromación dentro de "Data"
  gather_array() %>% 
  spread_all()%>%
  select(Valor) # Seleccionamos la variable que posee 

# Unimos MetaData_df y Data_df usando "..JSON". Extraemos la columna "..JSON" como identificador 
# Expandimos la columna "..JSON" con prefijo para evitar conflictos de nombres
MetaData_df <- 
  MetaData_df %>%
  unnest_wider(..JSON, names_sep = "_json")

Data_df <- 
  Data_df %>%
  unnest_wider(..JSON, names_sep = "_json")

# Creamos un identificador único para cada fila
MetaData_df <- 
  MetaData_df %>%
  mutate(id = row_number())

Data_df <- 
  Data_df %>%
  mutate(id = row_number())

# Hacemos la unión de los df por la columna id que hemos creado con la variable lista "..JSON"
espana_df <- 
  MetaData_df %>%
  left_join(Data_df, by = "id") %>% # Unimos con Data_df usando 'id'
  mutate(Nombre = espana_json$Nombre) # Agregamos la columna "Nombre" del espana_json

#attributes(MetaData_df)  
#attributes(Data_df)
#print(MetaData_df)
#print(Data_df)
#print(espana_json)
#print(espana_df)


datatable(espana_df)

Carga de datos XLS

Queremos extraer los datos sobre los accidentes laborales que suceden en Canarias. Como es un archivo con extensión .xls, utilizamos read_excel.

# Cargamos los archivos con extensión .xls
library(readxl)
library(DT)

canarias_df <- read_excel("INPUT/DATA/Accidentes_laborales_Canarias.xls")
#class(canarias_df)

#print(canarias_df)
datatable(canarias_df)

Carga de datos CSV

Queremos extraer los datos sobre la salud mental en los habitantes de Canarias. Como es un archivo con extensión .csv, utilizamos read_delim e indicamos que el delimitador es ; Al imprimirlo como tabla con la función datatable nos da un error con el formato, es decir, indica que hay un problema con la codificación del archivo CSV. En este caso, el error nos indica que los archivos están codificados en UTF-8, pero revisando la tabla incluye caracteres como acentos. Por eso, utilizamos locale que es una forma de configurar la codificación de caracteres que define cómo se representan los caracteres de texto en bytes. En conclusión con encoding = “ISO-8859-1” queremos que R interprete el archivo usando la codificación Latin-1, esta configuración asegura que los caracteres especiales se lean e interpreten de forma adecuada, evitando caracteres raros.

# Cargamos los archivos con extensión .csv
library(readr)
library(DT)

Salud_df <- read_delim ("INPUT/DATA/Estados_de_salud_Canarias.csv.csv", delim = ";", locale = locale(encoding = "ISO-8859-1"))
## Rows: 100 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (3): sexos_grupos_edad, indicadores, autovaloracion_estado_salud_relacio...
## dbl (2): anios, poblacion_16_mas_anios
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#class(Salud_df)

datatable(Salud_df)

Carga de datos XLSX

Queremos extraer los datos sobre la gravedad de las enfermedades laborales producidas en Aragón. Como es un archivo con extensión .xlsx, utilizamos read_excel.

# Cargamos los archivos con extensión .xlsx
library(readxl)
library(DT)

Aragon_df <- read_excel ("INPUT/DATA/070901-02_Por grado y sexo. Aragon.xlsx")
## New names:
## • `Grupo Grado Código` -> `Grupo Grado Código...4`
## • `Grupo Grado Código` -> `Grupo Grado Código...5`
#class(Aragon_df)

print(Aragon_df)
## # A tibble: 121 × 6
##      Año Sexo    `Nº Accidentes` `Grupo Grado Código...4` Grupo Grado Código..…¹
##    <dbl> <chr>             <dbl> <chr>                                     <dbl>
##  1  2023 Hombres           12082 Leves                                         1
##  2  2023 Mujeres            4784 Leves                                         1
##  3  2022 Hombres           11954 Leves                                         1
##  4  2022 Mujeres            5073 Leves                                         1
##  5  2021 Hombres           11559 Leves                                         1
##  6  2021 Mujeres            4739 Leves                                         1
##  7  2020 Hombres           10651 Leves                                         1
##  8  2020 Mujeres            4727 Leves                                         1
##  9  2019 Hombres           11909 Leves                                         1
## 10  2019 Mujeres            4511 Leves                                         1
## # ℹ 111 more rows
## # ℹ abbreviated name: ¹​`Grupo Grado Código...5`
## # ℹ 1 more variable: CCAA <chr>
datatable(Aragon_df)

Cambiar nombre de las columnas

Vamos a cambiar los nombres de las distintas columnas de los datos extraídos. Cambiamos los nombres de las columnas del conjunto de datos sobre los accidentes laborales que suceden en Canarias.

library(tidyverse)
library(DT)

#attributes(canarias_df)
canarias <- rename(.data = canarias_df, Año = `TIME_PERIOD#es`, Año2 = `TIME_PERIOD_CODE`, Sexo = `SEXO#es`, SexoCod = `SEXO_CODE`, Gravedad = `ACCIDENTE_GRAVEDAD#es`, GravedadCod = `ACCIDENTE_GRAVEDAD_CODE`, TipoTrab = `TIPO_TRABAJO#es`, TipoTrabCod = `TIPO_TRABAJO_CODE`, TrabHabitual = `TRABAJO_HABITUAL#es`, TrabHabCod = `TRABAJO_HABITUAL_CODE`, Obs = `OBS_VALUE`, ConfeciObs = `CONFIDENCIALIDAD_OBSERVACION#es`, Notasobs = `NOTAS_OBSERVACION#es`, Estadosobs = `ESTADO_OBSERVACION#es`)

#print(canarias)
datatable(canarias)

Cambiamos los nombres de las columnas del conjunto de datos sobre la gravedad de las enfermedades laborales producidas en Aragón.

library(tidyverse)
library(DT)

#attributes(Aragon_df)
Aragon <- rename(.data = Aragon_df, NumAcci = `Nº Accidentes`, Gravedad = `Grupo Grado Código...4`, GravedadCod = `Grupo Grado Código...5`)

#print(Aragon)
datatable(Aragon)

Cambiamos los nombres de las columnas del conjunto de datos sobre las enfermedades laborales que suceden en España.

library(tidyverse)
library(DT)

#attributes(espana_df)
Espana <- rename(.data = espana_df, TipoEnf = `T3_Variable`, Indicador = `Codigo`, Variable = `..JSON_jsonT3_Variable`, Nombre = `..JSON_jsonNombre`, Codigo = `..JSON_jsonCodigo`, jsonValor = `..JSON_jsonValor`)

#print(Espana)
datatable(Espana)

Cambiamos los nombres de las columnas del conjunto de datos sobre la salud mental en los habitantes de Canarias.

library(tidyverse)
library(DT)

#attributes(Salud_df)
Salud <- rename(.data = Salud_df, Sexo = `sexos_grupos_edad`, EstadoAnsiedad = `autovaloracion_estado_salud_relacion_situaciones_ansiedad`, Años = `anios`, Obs = `poblacion_16_mas_anios`)

#print(Salud)
datatable(Salud)

Eliminar los valores nulos

Eliminamos los valores nulos del conjunto de datos sobre los accidentes laborales que suceden en Canarias. Con select observamos las columnas que poseen valores nulos..

library(dplyr)

canarias %>%
select(where(~ all(is.na(.))))
## # A tibble: 6,480 × 3
##    ConfeciObs Notasobs Estadosobs
##    <lgl>      <lgl>    <lgl>     
##  1 NA         NA       NA        
##  2 NA         NA       NA        
##  3 NA         NA       NA        
##  4 NA         NA       NA        
##  5 NA         NA       NA        
##  6 NA         NA       NA        
##  7 NA         NA       NA        
##  8 NA         NA       NA        
##  9 NA         NA       NA        
## 10 NA         NA       NA        
## # ℹ 6,470 more rows

Para poder eliminar las columnas que poseen datos con argumentos nulos utilizamos la función filter que nos devolverá solo las columnas con valores de interés.

canarias <- Filter(function(x) !all(is.na(x)), canarias)
datatable(canarias)

Eliminar columnas

Eliminamos las columnas que no nos va a interesar estudiar para ello, seleccionamos las columnas que nos interesan. En el único conjunto de datos que no vamos a eliminar columnas es en los datos sobre la salud mental en los habitantes de Canarias. Primero vamos a eliminar las columnas del conjunto de datos de canarias. Nos vamos a quedar solo con las columnas Año, Sexo, Gravedad, TipoTrab y Obs.

library(dplyr)

canarias <- 
  canarias%>% 
  select(Año, Sexo, Gravedad, TipoTrab, Obs)
datatable(canarias)

En segundo lugar, eiminamos las columnas del conjunto de datos de Aragon. Nos vamos a quedar solo con las columnas Año, Sexo, NumAcci y Gravedad.

library(dplyr)

Aragon <- 
  Aragon%>%
  select(Año, Sexo, NumAcci, Gravedad)
datatable(Aragon)

En tercer lugar, eiminamos las columnas del conjunto de datos de Espana. Nos vamos a quedar solo con las columnas TipoEnf, Nombre, id y Valor.

library(dplyr)

Espana <- 
  Espana%>%
  select(TipoEnf, Nombre, id, Valor)
datatable(Espana)

Eliminar filas

Eliminamos las filas que no nos va a interesar estudiar.

#ELIMINAR FILAS

Salud <- subset(Salud, !Sexo %in% c("De 16 a 64 a\xf1os", "De 65 y m\xe1s a\xf1os"))

#canarias <- subset(canarias, !TipoTrabCod %in% c("4|9|_T|3|6|0|5|1"))

Espana <- subset (Espana, !TipoEnf %in% c ("Cardiopartía|Dolor de cabeza|infecciosa|No sabe|problema de salud|Problemaauditivo|dermatológico|gástrico|respiratorio|Total"))

Realizar un dataframe conjunto

Realizamos un dataframe uniendo los datos sobre la gravedad de las enfermedades laborales en Aragón y la salud mental de los ciudadanos en Canarias.

library(DT)

# Unimos por una columna común "Sexo"
df_Salu_Arag <- merge(Aragon, Salud, by = "Sexo")

datatable(df_Salu_Arag)

Realizamos un dataframe uniendo los datos sobre los accidentes laborales que suceden en Canarias y los datos sobre las enfermedades laborales que suceden en España. Como tenemos dos nombres de columnas diferentes aunque recoge el mismo tipo de valores vamos a utilizar un inner_join buscando coincidencias exactas entre el atributo Obs del conjunto de datos Espana y el atributo Valor del conjunto de datos canarias. Como existen valores iguales en ambos atributos eliminamos duplicados.

library(DT)

canarias_dis <-
  canarias %>%
  distinct(Obs, .keep_all = TRUE)

Espana_dis <-
  Espana %>%
  distinct(Valor, .keep_all = TRUE)

df_cana_Esp <- 
  canarias_dis %>%
  inner_join(Espana_dis, by = c("Obs" = "Valor"))

datatable(df_cana_Esp)

Función

Cantidad de hombres y mujeres del dataframe

hombres <- sum(df_cana_Esp$Sexo == "Hombres")
mujeres <- sum(df_cana_Esp$Sexo == "Mujeres")


print(hombres)
## [1] 3
print (mujeres)
## [1] 0

Sumatorio de casos en los que muestra la cantidad de personas (según el sexo) que tienen el tipo de enfermedad


cat("¿Quieres saber cuantos hombres (1), mujeres (2) o total (3) tienen problemas óseos?")

condicion <- as.integer(readline(prompt = "Ingresa el número de la condición (1, 2 o 3): "))

numero <- 0

if (condicion == 1){
  for (i in 1:nrow(df_cana_Esp)) {
    if (df_cana_Esp$Sexo[i] == "Hombres" && df_cana_Esp$Nombre[i] == "Problema óseo, articular o muscular que afecta principalmente a las caderas, las piernas o los pies")
    {numero <- numero + 1} 
  }
} else if (condicion == 2){
  for (i in 1:nrow(df_cana_Esp)) {
  if (df_cana_Esp$Sexo[i] == "Mujeres" && df_cana_Esp$Nombre[i] == "Problema óseo, articular o muscular que afecta principalmente a las caderas, las piernas o los pies")
  {numero <- numero + 1} 
  }
} else if (condicion == 3) {
  for (i in 1:nrow(df_cana_Esp)) {
  if (df_cana_Esp$Sexo[i] == "Total" && df_cana_Esp$Nombre[i] == "Problema óseo, articular o muscular que afecta principalmente al cuello, los hombros, los brazos o l") 
  {numero <- numero + 1} 
  } else ("Ingresa una de estas opciones: 1, 2 o 3\n")
}

cat("El número de casos es:", numero, "\n")
## Error: <text>:22:5: inesperado 'else'
## 21:   {numero <- numero + 1} 
## 22:   } else
##         ^

Imágenes que muestran los daños que ocurren en los distintos casos:

Función que determina la cantidad de personas que tienen una enfermedad segun el sexo y la enfermedad

Cantidad1 <- df_cana_Esp$Obs[df_cana_Esp$Sexo == "Hombres" & df_cana_Esp$Nombre == "Problema óseo, articular o muscular que afecta principalmente a las caderas, las piernas o los pies"]

print(Cantidad1)
## [1] 26
Cantidad2 <- df_cana_Esp$Obs[df_cana_Esp$Sexo == "Total" & df_cana_Esp$Nombre == "Problema óseo, articular o muscular que afecta principalmente al cuello, los hombros, los brazos o l"]
  
print (sum(Cantidad2))
## [1] 136

Pivotar

Vamos a transponer la estructura de nuestra tabla ordenada Espana desde largo a ancho.

Long_Espana <- pivot_wider(data = Espana, names_from = "Nombre", values_from = "Valor")

datatable(Long_Espana)

Elimino los valores nulos que están presentes tras pivotar el conjunto de datos de España

library(dplyr)
library(DT)

Espana_piv <-
  Long_Espana %>%
  select(where(~ all(is.na(.))))

datatable(Espana_piv)

Gráfico

Añadimos un gráfico de barras para observar el número de accidentes laborales sucedidos durante los difrentes años en Aragón. Para ello, utilizaremos el atributo de Año y NumAcci del conjunto de datos sobre los accidentes laborales en Aragón.

library(tidyverse)

ggplot(data = Aragon, aes(x = Año, y = NumAcci)) +
  geom_bar(stat = "identity", fill = "darkturquoise") +
  xlab("Año del suceso") +
  ylab("Número de accidentes laborales") +
  ggtitle(label = "Número de accidentes según el año del suceso")
## Error in render(x, visible = TRUE, envir = parent.frame()): los argumentos no fueron usados (visible = TRUE, envir = parent.frame())

Resultados

Conclusiones

añadir los dos url de los articulos https://www.omniamachinery.com/es/2022/05/mental-health-in-construction/

Referencias

https://osha.europa.eu/es/themes/work-related-diseases https://stackoverflow.com/search?q=input+string+1+is+invalid+UTF-8

url articulos https://www.who.int/es/news-room/fact-sheets/detail/mental-disorders https://www.redalyc.org/journal/170/17049838011/html/#:~:text=Fundamentos%3A%20Seg%C3%BAn%20las%20estad%C3%ADsticas%20oficiales,participaci%C3%B3n%20en%20el%20mundo%20laboral.

Bibliografia imagenes: imagen oseo I1 https://www.bing.com/images/search?view=detailV2&ccid=HIZKeiyE&id=8A29147F9411B08DEB7C49034609DD195464A548&thid=OIP.HIZKeiyEroiF0yAK1ajaLwHaD3&mediaurl=https%3a%2f%2fwww.comunidadmielomamultiple.com%2fwp-content%2fuploads%2fcemmp-dano-oseo.webp&cdnurl=https%3a%2f%2fth.bing.com%2fth%2fid%2fR.1c864a7a2c84ae8885d3200ad5a8da2f%3frik%3dSKVkVBndCUYDSQ%26pid%3dImgRaw%26r%3d0&exph=627&expw=1200&q=imagen+da%c3%b1o+oseo&FORM=IRPRST&ck=52479B4305056814AD24AB193C144909&selectedIndex=7&itb=0&ajaxhist=0&ajaxserp=0

imagen muscular I2 https://www.bing.com/images/search?view=detailV2&ccid=aV2FcEIh&id=D6AACCBEBEF450E1CBDF67C21D16BF507DF9DA43&thid=OIP.aV2FcEIhl45rkm4m6VFzRgHaD5&mediaurl=https%3a%2f%2frealidadfitness.com%2fwp-content%2fuploads%2f2019%2f05%2fentrenamiento-da%c3%b1o-muscular-1024x538.jpg&cdnurl=https%3a%2f%2fth.bing.com%2fth%2fid%2fR.695d85704221978e6b926e26e9517346%3frik%3dQ9r5fVC%252fFh3CZw%26pid%3dImgRaw%26r%3d0&exph=538&expw=1024&q=imagen+da%c3%b1o+muscular&FORM=IRPRST&ck=99E22962D1608D4D57756ACE0E6D4FE9&selectedIndex=1&itb=0&ajaxhist=0&ajaxserp=0

imagen articular I3 https://www.bing.com/images/search?view=detailV2&ccid=KaDQGmnp&id=2E3760EF62FCCC59509810F95B6010E199FCE071&thid=OIP.KaDQGmnpM8DYGR0vUebPSAHaEM&mediaurl=https%3a%2f%2fvitalclinic.es%2fwp-content%2fuploads%2f2019%2f11%2fartrosis-reumatoide.jpg&cdnurl=https%3a%2f%2fth.bing.com%2fth%2fid%2fR.29a0d01a69e933c0d8191d2f51e6cf48%3frik%3dceD8meEQYFv5EA%26pid%3dImgRaw%26r%3d0&exph=680&expw=1200&q=imagen+da%c3%b1o+articular&FORM=IRPRST&ck=62865A1BF4CB8E9BA729F41897ADACED&selectedIndex=2&itb=0&ajaxhist=0&ajaxserp=0

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.